package authz

import (
	"encoding/json"

	authzv1 "gitee.com/youkelike/ziam/zapi/authz/v1"
	"gitee.com/youkelike/ziam/zsdk/sdk/request"
	"gitee.com/youkelike/ziam/zsdk/sdk/response"
	"github.com/ory/ladon"
)

// 这个文件用于定义具体某个接口的参数、返回值、调用方法，每个接口一个这样的文件。
// 请求参数、返回值的结构体中都有所有接口公用部分和每个接口独有部分，

type AuthzRequest struct {
	// 请求参数中的公用部分，在请求参数构造方法中就赋值了，
	// 构造请求时用到，但不能做为 path、query、body 参数
	*request.BaseRequest

	// 接口独有部分则在拿到请求参数实例后、实际调用接口前赋值，
	// 需要加到 url 或 body 中
	Resource *string `json:"resource"`
	Action   *string `json:"action"`
	Subject  *string `json:"subject"`
	Context  *ladon.Context
}

type AuthzResponse struct {
	*response.BaseResponse

	authzv1.Response
	// Allowed bool   `json:"allowed,omitempty"`
	// Denied  bool   `json:"denied,omitempty"`
	// Reason  string `json:"reason,omitempty"`
	// Error   string `json:"error,omitempty"`
}

func NewAuthzRequest() (req *AuthzRequest) {
	req = &AuthzRequest{
		BaseRequest: &request.BaseRequest{
			URL:     "/authz",
			Method:  "POST",
			Header:  nil,
			Version: "v1",
		},
	}
	return
}

func NewAuthzResponse() *AuthzResponse {
	return &AuthzResponse{
		BaseResponse: &response.BaseResponse{},
	}
}

func (r *AuthzResponse) String() string {
	data, _ := json.Marshal(r)
	return string(data)
}

// 接口调用方法
func (c *Client) Authz(req *AuthzRequest) (resp *AuthzResponse, err error) {
	resp = NewAuthzResponse()

	if req == nil {
		req = NewAuthzRequest()
	}

	err = c.Send(req, resp)
	if err != nil {
		return
	}

	if resp.Body != nil && len(resp.Body) > 0 {
		err = json.Unmarshal(resp.Body, &resp.Response)
	}
	return
}
